﻿#include "PostGraphObjectBase.h"
#include "PostGraphProperty.h"

#include "FITK_Component/FITKRenderWindowVTK/FITKGraph3DWindowVTK.h"
#include "FITK_Interface/FITKInterfaceCFDPost/FITKAbstractCFDPostData.h"

#include <vtkDataSetMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkProp.h>
#include <vtkScalarBarWidget.h>

#include <QDebug>
namespace Interface
{
    PostGraphObjectBase::PostGraphObjectBase(FITKAbstractCFDPostData* postData, Comp::FITKGraph3DWindowVTK* graph3DWidget) :
        Comp::FITKGraphObjectVTK(postData), _postData(postData), _currentWidget(graph3DWidget)
    {
        if (_postData == nullptr)return;
        _postData->setScalarBarWidgetInteractor(graph3DWidget->getVTKRenderWindow()->GetInteractor());
        _property = new PostGraphProperty(this, _postData);
    }

    PostGraphObjectBase::~PostGraphObjectBase()
    {
        if (_property) {
            delete _property;
            _property = nullptr;
        }
    }

    void PostGraphObjectBase::create()
    {
        QList<vtkMapper*> mappers = _postData->getMappers();
        for (vtkMapper* mapper : mappers) {
            if (mapper == nullptr)continue;
            vtkActor* actor = vtkActor::New();
            actor->SetMapper(mapper);
            this->addActor(actor);
        }
    }

    int PostGraphObjectBase::getPostID()
    {
        if (_postData == nullptr)return -1;
        return _postData->getDataObjectID();
    }

    PostGraphProperty * PostGraphObjectBase::getProperty()
    {
        return _property;
    }

    QList<vtkProp*> PostGraphObjectBase::getActors()
    {
        return m_actorList;
    }

    void PostGraphObjectBase::setIsShow(bool isShow)
    {
        if (_postData == nullptr)return;
        vtkScalarBarWidget* scalarBarWidget = _postData->getScalarBarWidget();
        if (scalarBarWidget == nullptr)return;
        if (isShow == _postData->isEnable())return;
        _postData->enable(isShow);

        //隐藏所有actor
        for (int i = 0; i < m_actorList.size(); i++) {
            vtkProp* actor = m_actorList[i];
            if (isShow) actor->SetVisibility(true);
            else actor->SetVisibility(false);
        }
        
        //隐藏标量显示界面
        if (isShow) {
            bool scalarBarWidgetShowType = _property->getScalarBarWidgetIsShow();
            if (scalarBarWidgetShowType)scalarBarWidget->On();
            else scalarBarWidget->Off();
        }
        else {
            scalarBarWidget->Off();
        }
    }

    int PostGraphObjectBase::getRenderLayer()
    {
        return 0;
    }
}

